package com.malou.client.pagos.pagoletras;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.data.BeanModelFactory;
import com.extjs.gxt.ui.client.data.BeanModelLookup;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.GridEvent;
import com.extjs.gxt.ui.client.event.KeyListener;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.util.IconHelper;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.DateField;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.FormPanel.LabelAlign;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.layout.ColumnData;
import com.extjs.gxt.ui.client.widget.layout.ColumnLayout;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.layout.FormLayout;
import com.extjs.gxt.ui.client.widget.toolbar.ToolBar;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.google.gwt.i18n.client.NumberFormat;
import com.malou.client.MalouConstants;
import com.malou.client.MalouMessages;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.ingresostock.IngresoStocks;

public class PagoLetraDialog extends Dialog{

	public ComboBox<BeanModel> cmbProveedor;
	private TextField<String> txtNumeroletra;
	private TextField<String> txtNumerodocumento;
	private DateField fechavencimiento;
	private NumberField txtMonto;

	private ComboBox<BeanModel> cmbBanco;
	private Button btnAgregar;
	private Button btnGuardar;
	private Button btnLimpiar;
	private Button btnDelete;

	private FieldSet fsproveedor;
	private FieldSet fsLetra;
	private FormPanel panel;
	private ContentPanel panelgrid;
	
	private MalouConstants k = GWT.create(MalouConstants.class);
	private MalouMessages messages = GWT.create(MalouMessages.class);	
	
	private Grid<BeanModel> grid;
	private ToolBar toolbar;	
	private SelectionListener<ButtonEvent> sl_delete;
	private SelectionListener<ButtonEvent> sl_add;
	private List<ColumnConfig> columns;
	private ColumnModel cm;
	private ListStore<BeanModel> store;

	public PagoLetraDialog() {
		super();
		setButtons("");
		setSize(700, 500);
		setHeading(k.letraRegistrar());
		setModal(false);
		setLayout(new BorderLayout());
		setModal(true);
		setResizable(false);
		setOnEsc(true);
		
		btnAgregar = new Button(k.agregar(),	IconHelper.createPath("images/icons/new.gif"));
		btnDelete = new Button(k.eliminar(),	IconHelper.createPath("images/icons/delete.gif"));
		btnAgregar.setStyleAttribute("marginRight", "15px");
		btnGuardar = new Button(k.guardar());
		btnLimpiar = new Button(k.limpiar());
		btnLimpiar.addSelectionListener(new SelectionListener<ButtonEvent>() {
			
			@Override
			public void componentSelected(ButtonEvent ce) {
			limpiar();
				
			}
		});
		SelectionListener<ButtonEvent> sl_guardar = new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				if(panel.isValid()){
					
					if(store.getCount()==0){						
						MessageBox.alert(k.sistemaMarcocruzado(), k.letraDetalleRequerido(), null);
						txtNumeroletra.focus();
						return;
					}
					List<Letra> list = new ArrayList<Letra>();
					Letra letra;
					for(BeanModel b:store.getModels()){
						letra = new Letra();
						letra.setBanco_id((Integer)cmbBanco.getValue().get("id"));
						letra.setProveedor_id((Integer)cmbProveedor.getValue().get("id"));
						
						letra.setFechavencimiento((Date)b.get("fechavencimiento"));
						letra.setMonto((Double)b.get("monto"));
						letra.setNumerodocumento(b.get("numerodocumento").toString());
						letra.setNumeroletra(b.get("numeroletra").toString());
						
						list.add(letra);
					}
					getButtonBar().disable();
					Letras.letraDialog = PagoLetraDialog.this;
					Letras.save(list);
				}
			}
		};
		
		btnGuardar.addSelectionListener(sl_guardar);
		
		toolbar = new ToolBar();
		toolbar.setBorders(true);
		toolbar.add(btnDelete);
		toolbar.add(btnAgregar);		
	  
		sl_add = new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				agregarDetalle();				
			}
		};

		btnAgregar.addSelectionListener(sl_add);

	

		panel = new FormPanel();
		panel.setHeaderVisible(false);
		panel.setBodyBorder(false);
		panel.setLabelAlign(LabelAlign.TOP);
		
		panelgrid = new ContentPanel();
		panelgrid.setHeaderVisible(false);
		panelgrid.setBodyBorder(false);
		panelgrid.setBorders(false);
		panelgrid.setStyleAttribute("padding", "10px");
		//panelgrid.setStyleAttribute("marginRight", "5px");
		panelgrid.setLayout(new FitLayout());
		


		fsproveedor = new FieldSet();
		fsproveedor.setLayout(new ColumnLayout());
		fsproveedor.setCollapsible(false);
		fsproveedor.setHeading(k.letrasDatoProveedor());

		fsLetra = new FieldSet();
		fsLetra.setLayout(new ColumnLayout());
		fsLetra.setCollapsible(false);
		fsLetra.setHeading(k.letraDetalle());

		
		IngresoStocks.getComboProveedores();		
	    
		cmbProveedor = new ComboBox<BeanModel>();  
		cmbProveedor.setEditable(false);
		cmbProveedor.setFieldLabel(k.letrasProveedor());
		cmbProveedor.setDisplayField("razonsocial");
		cmbProveedor.setEmptyText("Seleccione...");
		cmbProveedor.setWidth(150);  
		cmbProveedor.setStore(IngresoStocks.storeProveedor);  
		cmbProveedor.setTypeAhead(true);  
		cmbProveedor.setTriggerAction(TriggerAction.ALL);
		cmbProveedor.setValueField("razonsocial");
		cmbProveedor.setAllowBlank(false);
		cmbProveedor.setUseQueryCache(false);	
		
		cmbProveedor.addKeyListener(new KeyListener(){
			public void componentKeyDown(ComponentEvent event){
				if(event.getKeyCode() == KeyCodes.KEY_ENTER){
					cmbBanco.focus();					
				}
			}
		});
		

		txtNumeroletra = new TextField<String>();
		txtNumeroletra.setFieldLabel(k.letraNumeroUnico());
		
		txtNumeroletra.addKeyListener(new KeyListener(){
			public void componentKeyDown(ComponentEvent event){
				if(event.getKeyCode() == KeyCodes.KEY_ENTER){
					txtNumerodocumento.focus();					
				}
			}
		});

		txtNumerodocumento = new TextField<String>();
		txtNumerodocumento.setFieldLabel(k.letraNumeroDocumento());
		
		txtNumerodocumento.addKeyListener(new KeyListener(){
			public void componentKeyDown(ComponentEvent event){
				if(event.getKeyCode() == KeyCodes.KEY_ENTER){
					fechavencimiento.focus();					
				}
			}
		});
        
		Letras.getComboBancos();
		cmbBanco = new ComboBox<BeanModel>();
		cmbBanco.setFieldLabel(k.letraBanco());
		cmbBanco.setEmptyText(k.seleccione());
		cmbBanco.setTriggerAction(TriggerAction.ALL);
		cmbBanco.setDisplayField("descripcion");
		cmbBanco.setStore(Letras.storeBanco);
		cmbBanco.setValueField("descripcion");
		cmbBanco.setUseQueryCache(false);
		cmbBanco.setEditable(false);
		cmbBanco.setAllowBlank(false);
		
		cmbBanco.addKeyListener(new KeyListener(){
			public void componentKeyDown(ComponentEvent event){
				if(event.getKeyCode() == KeyCodes.KEY_ENTER){
					txtNumeroletra.focus();					
				}
			}
		});
	
		fechavencimiento = new DateField();
		fechavencimiento.setFieldLabel(k.letraFechaVencimiento());
		fechavencimiento.getPropertyEditor().setFormat(DateTimeFormat.getFormat("yyyy-MM-dd"));
		
		fechavencimiento.addKeyListener(new KeyListener(){
			public void componentKeyDown(ComponentEvent event){
				if(event.getKeyCode() == KeyCodes.KEY_ENTER){
					txtMonto.focus();					
				}
			}
		});

		txtMonto = new NumberField();
		txtMonto.setFieldLabel(k.letraMonto());
		txtMonto.setAllowNegative(false);		
		txtMonto.setFormat(NumberFormat.getFormat("0.00"));
		txtMonto.setMinValue(1.00);
		
		txtMonto.addKeyListener(new KeyListener(){
			public void componentKeyDown(ComponentEvent event){
				if(event.getKeyCode() == KeyCodes.KEY_ENTER){
					agregarDetalle();					
				}
			}
		});

		fsproveedor.add(setLayout(cmbProveedor, "90%"), new ColumnData(.70));
		fsproveedor.add(setLayout(cmbBanco, "100%"), new ColumnData(.30));		

		fsLetra.add(setLayout(txtNumeroletra, "85%"), new ColumnData(.25));
		fsLetra.add(setLayout(txtNumerodocumento, "85%"), new ColumnData(.25));
		fsLetra.add(setLayout(fechavencimiento, "85%"), new ColumnData(.20));
		fsLetra.add(setLayout(txtMonto, "85%"), new ColumnData(.19));
		fsLetra.add(setLayout2(btnAgregar, "0%"), new ColumnData(.11));

		panel.add(fsproveedor);
		panel.add(fsLetra);
		

		
		columns = new ArrayList<ColumnConfig>();
		columns.add(new ColumnConfig("numeroletra", k.letraNumeroUnico(), 200));
		columns.add(new ColumnConfig("numerodocumento", k.letraNumeroDocumento(), 150));
		columns.add(new ColumnConfig("monto", k.letraMonto(), 150));
		ColumnConfig fecha = new ColumnConfig("fechavencimiento", k.letraFechaVencimiento(),150);
		fecha.setDateTimeFormat(DateTimeFormat.getFormat("yyyy-MM-dd"));		
		columns.add(fecha);
		
		
		
		cm = new ColumnModel(columns);
		
		Letras.getPaginate();
		store = new ListStore<BeanModel>();
		grid = new Grid<BeanModel>(store, cm);
		grid.setAutoExpandColumn("numeroletra");
		grid.setLoadMask(true);
		grid.setBorders(true);
		grid.addListener(Events.Attach, new Listener<GridEvent<BeanModel>>() {
			@Override
			public void handleEvent(GridEvent<BeanModel> be) {
				Letras.loader.load(0, Utilities.itemsPerPage);
			}
		});

		grid.getSelectionModel().addListener(Events.SelectionChange,
				new Listener<SelectionChangedEvent<BeanModel>>() {

					@Override
					public void handleEvent(SelectionChangedEvent<BeanModel> be) {
						if(be.getSelectedItem() != null)
							btnDelete.setEnabled(true);
						else
							btnDelete.setEnabled(false);					

					}

				});	


		sl_delete = new SelectionListener<ButtonEvent>() {

			@Override
			public void componentSelected(ButtonEvent ce) {
				BeanModel be =grid.getSelectionModel().getSelectedItem();
				grid.getStore().remove(be);

			}
		};

		btnDelete.addSelectionListener(sl_delete);
		

		panelgrid.setTopComponent(toolbar);
		panelgrid.add(grid);
		
	    add(panel,new BorderLayoutData(LayoutRegion.NORTH,180));
	    add(panelgrid,new BorderLayoutData(LayoutRegion.CENTER));
	
	
	    addButton(btnGuardar);
		addButton(btnLimpiar);
		setButtonAlign(HorizontalAlignment.RIGHT);
	     
		setFocusWidget(cmbProveedor);

	}

	private LayoutContainer setLayout(Component comp, String porcentaje) {

		LayoutContainer lc5 = new LayoutContainer();
		FormLayout fl = new FormLayout(LabelAlign.TOP);
		fl.setLabelPad(0);

		lc5.setLayout(fl);
		lc5.setStyleAttribute("marginTop", "0px");
		lc5.add(comp, new FormData(porcentaje));
		
		return lc5;
	}

	private LayoutContainer setLayout2(Component comp, String porcentaje) {
		panel.setLabelAlign(LabelAlign.LEFT);
		LayoutContainer lc5 = new LayoutContainer();
		FormLayout fl = new FormLayout(LabelAlign.LEFT);
		fl.setLabelPad(0);
		if (comp == txtMonto)
			fl.setLabelWidth(50);
		else
			fl.setLabelWidth(110);
		
		lc5.setLayout(fl);
		lc5.setStyleAttribute("marginTop", "18px");
		lc5.add(comp, new FormData(porcentaje));
	
		return lc5;
	}
	
	private void setAllowBlackDetalle(Boolean b){
		txtNumeroletra.setAllowBlank(b);
		txtNumerodocumento.setAllowBlank(b);
		fechavencimiento.setAllowBlank(b);
		txtMonto.setAllowBlank(b);
		if(b){
			txtNumeroletra.clear();
			txtNumeroletra.focus();
			txtNumerodocumento.clear();
			fechavencimiento.clear();
			txtMonto.clear();
		}else{
			txtNumeroletra.validate();
			txtNumerodocumento.validate();
			fechavencimiento.validate();
			txtMonto.validate();
		}
	}
	private boolean isValidDetalle(){
		boolean nl = txtNumeroletra.isValid();
		boolean nd = txtNumerodocumento.isValid();
		boolean fv = fechavencimiento.isValid();
		boolean m = txtMonto.isValid();
		boolean detalle = true;
		if(txtNumeroletra.getValue() != null){
			String numero = txtNumeroletra.getValue().trim();
			for(BeanModel b:store.getModels()){
				String num = b.get("numeroletra").toString().trim();
				if(num.equals(numero)){
					detalle = false;
					String msg = messages.letraYaExisteLetra(numero);
					MessageBox.alert(k.sistemaMarcocruzado(), msg, null);
					txtNumeroletra.focus();
				}
				
			}
		}
		
		return nl && nd && fv && m && detalle;
	}
	public void agregarDetalle(){
		setAllowBlackDetalle(false);
		if(isValidDetalle()){		
			
			Letra letra = new Letra();
			letra.setNumerodocumento(txtNumerodocumento.getValue());
			letra.setNumeroletra(txtNumeroletra.getValue());
			letra.setFechavencimiento(fechavencimiento.getValue());
			letra.setMonto((Double)txtMonto.getValue());
			
			BeanModelFactory beanModelFactory =  BeanModelLookup.get().getFactory(letra.getClass());
	    	store.add(beanModelFactory.createModel(letra));
	    	setAllowBlackDetalle(true);
		}
	}
	
	
	public void limpiar(){
		
		cmbProveedor.clearSelections();
		cmbBanco.clearSelections();
		txtNumerodocumento.clear();
		txtNumeroletra.clear();
		fechavencimiento.clear();
		txtMonto.clear();
		cmbProveedor.focus();
		store.removeAll();
		
		
	}
	
}